home *** CD-ROM | disk | FTP | other *** search
/ AmigActive 10 / AACD 10.iso / AACD / Games / MAME / src / machine / neogeo.c < prev    next >
C/C++ Source or Header  |  2000-04-23  |  41KB  |  955 lines

  1. #include "driver.h"
  2. #include <time.h>
  3.  
  4. //static unsigned char *memcard;
  5. unsigned char *neogeo_ram;
  6. unsigned char *neogeo_sram;
  7.  
  8. static int sram_locked;
  9. static int sram_protection_hack;
  10.  
  11. extern int neogeo_has_trackball;
  12. extern int neogeo_irq2type;
  13.  
  14.  
  15. /* MARTINEZ.F 990209 Calendar */
  16. extern int seconds;
  17. extern int minutes;
  18. extern int hours;
  19. extern int days;
  20. extern int month;
  21. extern int year;
  22. extern int weekday;
  23. /* MARTINEZ.F 990209 Calendar End */
  24.  
  25. /***************** MEMCARD GLOBAL VARIABLES ******************/
  26. int            mcd_action=0;
  27. int            mcd_number=0;
  28. int            memcard_status=0;    /* 1=Inserted 0=No card */
  29. int            memcard_number=0;    /* 000...999, -1=None */
  30. int            memcard_manager=0;    /* 0=Normal boot 1=Call memcard manager */
  31. unsigned char    *neogeo_memcard;    /* Pointer to 2kb RAM zone */
  32.  
  33. /*************** MEMCARD FUNCTION PROTOTYPES *****************/
  34. READ_HANDLER(         neogeo_memcard_r );
  35. WRITE_HANDLER(         neogeo_memcard_w );
  36. int        neogeo_memcard_load(int);
  37. void        neogeo_memcard_save(void);
  38. void        neogeo_memcard_eject(void);
  39. int        neogeo_memcard_create(int);
  40.  
  41.  
  42.  
  43. static void neogeo_custom_memory(void);
  44.  
  45.  
  46. /* This function is called on every reset */
  47. void neogeo_init_machine(void)
  48. {
  49.     int src,res;
  50.     time_t        ltime;
  51.     struct tm        *today;
  52.  
  53.  
  54.     /* Reset variables & RAM */
  55.     memset (neogeo_ram, 0, 0x10000);
  56.  
  57.     /* Set up machine country */
  58.     src = readinputport(5);
  59.     res = src&0x3;
  60.  
  61.     /* Console/arcade mode */
  62.     if (src & 0x04)    res |= 0x8000;
  63.  
  64.     /* write the ID in the system BIOS ROM */
  65.     WRITE_WORD(&memory_region(REGION_USER1)[0x0400],res);
  66.  
  67.     if (memcard_manager==1)
  68.     {
  69.         memcard_manager=0;
  70.         WRITE_WORD(&memory_region(REGION_USER1)[0x11b1a], 0x500a);
  71.     }
  72.     else
  73.     {
  74.         WRITE_WORD(&memory_region(REGION_USER1)[0x11b1a],0x1b6a);
  75.     }
  76.  
  77.     time(<ime);
  78.     today = localtime(<ime);
  79.  
  80.     seconds = ((today->tm_sec/10)<<4) + (today->tm_sec%10);
  81.     minutes = ((today->tm_min/10)<<4) + (today->tm_min%10);
  82.     hours = ((today->tm_hour/10)<<4) + (today->tm_hour%10);
  83.     days = ((today->tm_mday/10)<<4) + (today->tm_mday%10);
  84.     month = (today->tm_mon + 1);
  85.     year = ((today->tm_year/10)<<4) + (today->tm_year%10);
  86.     weekday = today->tm_wday;
  87. }
  88.  
  89.  
  90. /* This function is only called once per game. */
  91. void init_neogeo(void)
  92. {
  93.     unsigned char *RAM = memory_region(REGION_CPU1);
  94.     extern struct YM2610interface neogeo_ym2610_interface;
  95.  
  96.     if (memory_region(REGION_SOUND2))
  97.     {
  98.         logerror("using memory region %d for Delta T samples\n",REGION_SOUND2);
  99.         neogeo_ym2610_interface.pcmromb[0] = REGION_SOUND2;
  100.     }
  101.     else
  102.     {
  103.         logerror("using memory region %d for Delta T samples\n",REGION_SOUND1);
  104.         neogeo_ym2610_interface.pcmromb[0] = REGION_SOUND1;
  105.     }
  106.  
  107.     /* Allocate ram banks */
  108.     neogeo_ram = malloc (0x10000);
  109.     cpu_setbank(1, neogeo_ram);
  110.  
  111.     /* Set the biosbank */
  112.     cpu_setbank(3, memory_region(REGION_USER1));
  113.  
  114.     /* Set the 2nd ROM bank */
  115.     RAM = memory_region(REGION_CPU1);
  116.     if (memory_region_length(REGION_CPU1) > 0x100000)
  117.     {
  118.         cpu_setbank(4, &RAM[0x100000]);
  119.     }
  120.     else
  121.     {
  122.         cpu_setbank(4, &RAM[0]);
  123.     }
  124.  
  125.     /* Set the sound CPU ROM banks */
  126.     RAM = memory_region(REGION_CPU2);
  127.     cpu_setbank(5,&RAM[0x08000]);
  128.     cpu_setbank(6,&RAM[0x0c000]);
  129.     cpu_setbank(7,&RAM[0x0e000]);
  130.     cpu_setbank(8,&RAM[0x0f000]);
  131.  
  132.     /* Allocate and point to the memcard - bank 5 */
  133.     neogeo_memcard = calloc (0x800, 1);
  134.     memcard_status=0;
  135.     memcard_number=0;
  136.  
  137.  
  138.     RAM = memory_region(REGION_USER1);
  139.  
  140.     if (READ_WORD(&RAM[0x11b00]) == 0x4eba)
  141.     {
  142.         /* standard bios */
  143.         neogeo_has_trackball = 0;
  144.  
  145.         /* Remove memory check for now */
  146.         WRITE_WORD(&RAM[0x11b00],0x4e71);
  147.         WRITE_WORD(&RAM[0x11b02],0x4e71);
  148.         WRITE_WORD(&RAM[0x11b16],0x4ef9);
  149.         WRITE_WORD(&RAM[0x11b18],0x00c1);
  150.         WRITE_WORD(&RAM[0x11b1a],0x1b6a);
  151.  
  152.         /* Patch bios rom, for Calendar errors */
  153.         WRITE_WORD(&RAM[0x11c14],0x4e71);
  154.         WRITE_WORD(&RAM[0x11c16],0x4e71);
  155.         WRITE_WORD(&RAM[0x11c1c],0x4e71);
  156.         WRITE_WORD(&RAM[0x11c1e],0x4e71);
  157.  
  158.         /* Rom internal checksum fails for now.. */
  159.         WRITE_WORD(&RAM[0x11c62],0x4e71);
  160.         WRITE_WORD(&RAM[0x11c64],0x4e71);
  161.     }
  162.     else
  163.     {
  164.         /* special bios with trackball support */
  165.         neogeo_has_trackball = 1;
  166.  
  167.         /* TODO: check the memcard manager patch in neogeo_init_machine(), */
  168.         /* it probably has to be moved as well */
  169.  
  170.         /* Remove memory check for now */
  171.         WRITE_WORD(&RAM[0x10c2a],0x4e71);
  172.         WRITE_WORD(&RAM[0x10c2c],0x4e71);
  173.         WRITE_WORD(&RAM[0x10c40],0x4ef9);
  174.         WRITE_WORD(&RAM[0x10c42],0x00c1);
  175.         WRITE_WORD(&RAM[0x10c44],0x0c94);
  176.  
  177.         /* Patch bios rom, for Calendar errors */
  178.         WRITE_WORD(&RAM[0x10d3e],0x4e71);
  179.         WRITE_WORD(&RAM[0x10d40],0x4e71);
  180.         WRITE_WORD(&RAM[0x10d46],0x4e71);
  181.         WRITE_WORD(&RAM[0x10d48],0x4e71);
  182.  
  183.         /* Rom internal checksum fails for now.. */
  184.         WRITE_WORD(&RAM[0x10d8c],0x4e71);
  185.         WRITE_WORD(&RAM[0x10d8e],0x4e71);
  186.     }
  187.  
  188.     /* Install custom memory handlers */
  189.     neogeo_custom_memory();
  190.  
  191.  
  192.     /* Flag how to handle IRQ2 raster effect */
  193.     /* 0=write 0,2   1=write2,0 */
  194.     if (!strcmp(Machine->gamedrv->name,"neocup98") ||
  195.         !strcmp(Machine->gamedrv->name,"ssideki3") ||
  196.         !strcmp(Machine->gamedrv->name,"ssideki4"))
  197.         neogeo_irq2type = 1;
  198. }
  199.  
  200. /******************************************************************************/
  201.  
  202. static READ_HANDLER( bios_cycle_skip_r )
  203. {
  204.     cpu_spinuntil_int();
  205.     return 0;
  206. }
  207.  
  208. /******************************************************************************/
  209. /* Routines to speed up the main processor                       */
  210. /******************************************************************************/
  211. #define NEO_CYCLE_R(name,pc,hit,other) static READ_HANDLER( name##_cycle_r ) {    if (cpu_get_pc()==pc) {cpu_spinuntil_int(); return hit;} return other;}
  212. #define NEO_CYCLE_RX(name,pc,hit,other,xxx) static READ_HANDLER( name##_cycle_r ) {    if (cpu_get_pc()==pc) {if(other==xxx) cpu_spinuntil_int(); return hit;} return other;}
  213.  
  214. NEO_CYCLE_R(puzzledp,0x12f2,1,                                READ_WORD(&neogeo_ram[0x0000]))
  215. NEO_CYCLE_R(samsho4, 0xaffc,0,                                READ_WORD(&neogeo_ram[0x830c]))
  216. NEO_CYCLE_R(karnovr, 0x5b56,0,                                READ_WORD(&neogeo_ram[0x3466]))
  217. NEO_CYCLE_R(wjammers,0x1362e,READ_WORD(&neogeo_ram[0x5a])&0x7fff,READ_WORD(&neogeo_ram[0x005a]))
  218. NEO_CYCLE_R(strhoops,0x029a,0,                                READ_WORD(&neogeo_ram[0x1200]))
  219. //NEO_CYCLE_R(magdrop3,0xa378,READ_WORD(&neogeo_ram[0x60])&0x7fff,READ_WORD(&neogeo_ram[0x0060]))
  220. NEO_CYCLE_R(neobombe,0x09f2,0xffff,                            READ_WORD(&neogeo_ram[0x448c]))
  221. NEO_CYCLE_R(trally, 0x1295c,READ_WORD(&neogeo_ram[0x206])-1,READ_WORD(&neogeo_ram[0x0206]))
  222. //NEO_CYCLE_R(joyjoy,  0x122c,0xffff,                            READ_WORD(&neogeo_ram[0x0554]))
  223. NEO_CYCLE_RX(blazstar,0x3b62,0xffff,                            READ_WORD(&neogeo_ram[0x1000]),0)
  224. //NEO_CYCLE_R(ridhero, 0xedb0,0,                                READ_WORD(&neogeo_ram[0x00ca]))
  225. NEO_CYCLE_R(cyberlip,0x2218,0x0f0f,                            READ_WORD(&neogeo_ram[0x7bb4]))
  226. NEO_CYCLE_R(lbowling,0x37b0,0,                                READ_WORD(&neogeo_ram[0x0098]))
  227. NEO_CYCLE_R(superspy,0x07ca,0xffff,                            READ_WORD(&neogeo_ram[0x108c]))
  228. NEO_CYCLE_R(ttbb,    0x0a58,0xffff,                            READ_WORD(&neogeo_ram[0x000e]))
  229. NEO_CYCLE_R(alpham2,0x076e,0xffff,                            READ_WORD(&neogeo_ram[0xe2fe]))
  230. NEO_CYCLE_R(eightman,0x12fa,0xffff,                            READ_WORD(&neogeo_ram[0x046e]))
  231. NEO_CYCLE_R(roboarmy,0x08e8,0,                                READ_WORD(&neogeo_ram[0x4010]))
  232. NEO_CYCLE_R(fatfury1,0x133c,0,                                READ_WORD(&neogeo_ram[0x4282]))
  233. NEO_CYCLE_R(burningf,0x0736,0xffff,                            READ_WORD(&neogeo_ram[0x000e]))
  234. NEO_CYCLE_R(bstars,  0x133c,0,                                READ_WORD(&neogeo_ram[0x000a]))
  235. NEO_CYCLE_R(kotm,    0x1284,0,                                READ_WORD(&neogeo_ram[0x0020]))
  236. NEO_CYCLE_R(gpilots, 0x0474,0,                                READ_WORD(&neogeo_ram[0xa682]))
  237. NEO_CYCLE_R(lresort, 0x256a,0,                                READ_WORD(&neogeo_ram[0x4102]))
  238. NEO_CYCLE_R(fbfrenzy,0x07dc,0,                                READ_WORD(&neogeo_ram[0x0020]))
  239. NEO_CYCLE_R(socbrawl,0xa8dc,0xffff,                            READ_WORD(&neogeo_ram[0xb20c]))
  240. NEO_CYCLE_R(mutnat,  0x1456,0,                                READ_WORD(&neogeo_ram[0x1042]))
  241. NEO_CYCLE_R(aof,     0x6798,0,                                READ_WORD(&neogeo_ram[0x8100]))
  242. //NEO_CYCLE_R(countb,  0x16a2,0,                                READ_WORD(&neogeo_ram[0x8002]))
  243. NEO_CYCLE_R(ncombat, 0xcb3e,0,                                READ_WORD(&neogeo_ram[0x0206]))
  244. NEO_CYCLE_R(sengoku, 0x12f4,0,                                READ_WORD(&neogeo_ram[0x0088]))
  245. //NEO_CYCLE_R(ncommand,0x11b44,0,                                READ_WORD(&neogeo_ram[0x8206]))
  246. NEO_CYCLE_R(wh1,     0xf62d4,0xffff,                        READ_WORD(&neogeo_ram[0x8206]))
  247. NEO_CYCLE_R(androdun,0x26d6,0xffff,                            READ_WORD(&neogeo_ram[0x0080]))
  248. NEO_CYCLE_R(bjourney,0xe8aa,READ_WORD(&neogeo_ram[0x206])+1,READ_WORD(&neogeo_ram[0x0206]))
  249. NEO_CYCLE_R(maglord, 0xb16a,READ_WORD(&neogeo_ram[0x206])+1,READ_WORD(&neogeo_ram[0x0206]))
  250. //NEO_CYCLE_R(janshin, 0x06a0,0,                                READ_WORD(&neogeo_ram[0x0026]))
  251. NEO_CYCLE_RX(pulstar, 0x2052,0xffff,                            READ_WORD(&neogeo_ram[0x1000]),0)
  252. //NEO_CYCLE_R(mslug   ,0x200a,0xffff,                            READ_WORD(&neogeo_ram[0x6ed8]))
  253. NEO_CYCLE_R(neodrift,0x0b76,0xffff,                            READ_WORD(&neogeo_ram[0x0424]))
  254. NEO_CYCLE_R(spinmast,0x00f6,READ_WORD(&neogeo_ram[0xf0])+1,    READ_WORD(&neogeo_ram[0x00f0]))
  255. NEO_CYCLE_R(sonicwi2,0x1e6c8,0xffff,                        READ_WORD(&neogeo_ram[0xe5b6]))
  256. NEO_CYCLE_R(sonicwi3,0x20bac,0xffff,                        READ_WORD(&neogeo_ram[0xea2e]))
  257. NEO_CYCLE_R(goalx3,  0x5298,READ_WORD(&neogeo_ram[0x6])+1,    READ_WORD(&neogeo_ram[0x0006]))
  258. //NEO_CYCLE_R(turfmast,0xd5a8,0xffff,                            READ_WORD(&neogeo_ram[0x2e54]))
  259. NEO_CYCLE_R(kabukikl,0x10b0,0,                                READ_WORD(&neogeo_ram[0x428a]))
  260. NEO_CYCLE_R(panicbom,0x3ee6,0xffff,                            READ_WORD(&neogeo_ram[0x009c]))
  261. NEO_CYCLE_R(wh2,     0x2063fc,READ_WORD(&neogeo_ram[0x8206])+1,READ_WORD(&neogeo_ram[0x8206]))
  262. NEO_CYCLE_R(wh2j,    0x109f4,READ_WORD(&neogeo_ram[0x8206])+1,READ_WORD(&neogeo_ram[0x8206]))
  263. NEO_CYCLE_R(aodk,    0xea62,READ_WORD(&neogeo_ram[0x8206])+1,READ_WORD(&neogeo_ram[0x8206]))
  264. NEO_CYCLE_R(whp,     0xeace,READ_WORD(&neogeo_ram[0x8206])+1,READ_WORD(&neogeo_ram[0x8206]))
  265. NEO_CYCLE_R(overtop, 0x1736,READ_WORD(&neogeo_ram[0x8202])+1,READ_WORD(&neogeo_ram[0x8202]))
  266. NEO_CYCLE_R(twinspri,0x492e,READ_WORD(&neogeo_ram[0x8206])+1,READ_WORD(&neogeo_ram[0x8206]))
  267. NEO_CYCLE_R(stakwin, 0x0596,0xffff,                            READ_WORD(&neogeo_ram[0x0b92]))
  268. NEO_CYCLE_R(shocktro,0xdd28,0,                                READ_WORD(&neogeo_ram[0x8344]))
  269. NEO_CYCLE_R(tws96,   0x17f4,0xffff,                            READ_WORD(&neogeo_ram[0x010e]))
  270. //static READ_HANDLER( zedblade_cycle_r )
  271. //{
  272. //    int pc=cpu_get_pc();
  273. //    if (pc==0xa2fa || pc==0xa2a0 || pc==0xa2ce || pc==0xa396 || pc==0xa3fa) {cpu_spinuntil_int(); return 0;}
  274. //    return READ_WORD(&neogeo_ram[0x9004]);
  275. //}
  276. //NEO_CYCLE_R(doubledr,0x3574,0,                                READ_WORD(&neogeo_ram[0x1c30]))
  277. NEO_CYCLE_R(galaxyfg,0x09ea,READ_WORD(&neogeo_ram[0x1858])+1,READ_WORD(&neogeo_ram[0x1858]))
  278. NEO_CYCLE_R(wakuwak7,0x1a3c,READ_WORD(&neogeo_ram[0x0bd4])+1,READ_WORD(&neogeo_ram[0x0bd4]))
  279. static READ_HANDLER( mahretsu_cycle_r )
  280. {
  281.     int pc=cpu_get_pc();
  282.     if (pc==0x1580 || pc==0xf3ba ) {cpu_spinuntil_int(); return 0;}
  283.     return READ_WORD(&neogeo_ram[0x13b2]);
  284. }
  285. NEO_CYCLE_R(nam1975, 0x0a1c,0xffff,                            READ_WORD(&neogeo_ram[0x12e0]))
  286. NEO_CYCLE_R(tpgolf,  0x105c,0,                                READ_WORD(&neogeo_ram[0x00a4]))
  287. NEO_CYCLE_R(legendos,0x1864,0xffff,                            READ_WORD(&neogeo_ram[0x0002]))
  288. //NEO_CYCLE_R(viewpoin,0x0c16,0,                                READ_WORD(&neogeo_ram[0x1216]))
  289. NEO_CYCLE_R(fatfury2,0x10ea,0,                                READ_WORD(&neogeo_ram[0x418c]))
  290. NEO_CYCLE_R(bstars2, 0x7e30,0xffff,                            READ_WORD(&neogeo_ram[0x001c]))
  291. NEO_CYCLE_R(ssideki, 0x20b0,0xffff,                            READ_WORD(&neogeo_ram[0x8c84]))
  292. NEO_CYCLE_R(kotm2,   0x045a,0,                                READ_WORD(&neogeo_ram[0x1000]))
  293. static READ_HANDLER( samsho_cycle_r )
  294. {
  295.     int pc=cpu_get_pc();
  296.     if (pc==0x3580 || pc==0x0f84 ) {cpu_spinuntil_int(); return 0xffff;}
  297.     return READ_WORD(&neogeo_ram[0x0a76]);
  298. }
  299. NEO_CYCLE_R(fatfursp,0x10da,0,                                READ_WORD(&neogeo_ram[0x418c]))
  300. NEO_CYCLE_R(fatfury3,0x9c50,0,                                READ_WORD(&neogeo_ram[0x418c]))
  301. NEO_CYCLE_R(tophuntr,0x0ce0,0xffff,                            READ_WORD(&neogeo_ram[0x008e]))
  302. NEO_CYCLE_R(savagere,0x056e,0,                                READ_WORD(&neogeo_ram[0x8404]))
  303. NEO_CYCLE_R(aof2,    0x8c74,0,                                READ_WORD(&neogeo_ram[0x8280]))
  304. //NEO_CYCLE_R(ssideki2,0x7850,0xffff,                            READ_WORD(&neogeo_ram[0x4292]))
  305. NEO_CYCLE_R(samsho2, 0x1432,0xffff,                            READ_WORD(&neogeo_ram[0x0a30]))
  306. NEO_CYCLE_R(samsho3, 0x0858,0,                                READ_WORD(&neogeo_ram[0x8408]))
  307. NEO_CYCLE_R(kof95,   0x39474,0xffff,                        READ_WORD(&neogeo_ram[0xa784]))
  308. NEO_CYCLE_R(rbff1,   0x80a2,0,                                READ_WORD(&neogeo_ram[0x418c]))
  309. //NEO_CYCLE_R(aof3,    0x15d6,0,                                READ_WORD(&neogeo_ram[0x4ee8]))
  310. NEO_CYCLE_R(ninjamas,0x2436,READ_WORD(&neogeo_ram[0x8206])+1,READ_WORD(&neogeo_ram[0x8206]))
  311. NEO_CYCLE_R(kof96,   0x8fc4,0xffff,                            READ_WORD(&neogeo_ram[0xa782]))
  312. NEO_CYCLE_R(rbffspec,0x8704,0,                                READ_WORD(&neogeo_ram[0x418c]))
  313. NEO_CYCLE_R(kizuna,  0x0840,0,                                READ_WORD(&neogeo_ram[0x8808]))
  314. NEO_CYCLE_R(kof97,   0x9c54,0xffff,                            READ_WORD(&neogeo_ram[0xa784]))
  315. //NEO_CYCLE_R(mslug2,  0x1656,0xffff,                        READ_WORD(&neogeo_ram[0x008c]))
  316. NEO_CYCLE_R(rbff2,   0xc5d0,0,                                READ_WORD(&neogeo_ram[0x418c]))
  317. NEO_CYCLE_R(ragnagrd,0xc6c0,0,                                READ_WORD(&neogeo_ram[0x0042]))
  318. NEO_CYCLE_R(lastblad,0x1868,0xffff,                            READ_WORD(&neogeo_ram[0x9d4e]))
  319. NEO_CYCLE_R(gururin, 0x0604,0xffff,                            READ_WORD(&neogeo_ram[0x1002]))
  320. //NEO_CYCLE_R(magdrop2,0x1cf3a,0,                                READ_WORD(&neogeo_ram[0x0064]))
  321. //NEO_CYCLE_R(miexchng,0x,,READ_WORD(&neogeo_ram[0x]))
  322.  
  323. NEO_CYCLE_R(kof98,       0xa146,0xfff,  READ_WORD(&neogeo_ram[0xa784]))
  324. NEO_CYCLE_R(marukodq,0x070e,0,          READ_WORD(&neogeo_ram[0x0210]))
  325. static READ_HANDLER( minasan_cycle_r )
  326. {
  327.         int mem;
  328.         if (cpu_get_pc()==0x17766)
  329.         {
  330.                 cpu_spinuntil_int();
  331.                 mem=READ_WORD(&neogeo_ram[0x00ca]);
  332.                 mem--;
  333.                 WRITE_WORD(&neogeo_ram[0x00ca],mem);
  334.                 return mem;
  335.         }
  336.         return READ_WORD(&neogeo_ram[0x00ca]);
  337. }
  338. NEO_CYCLE_R(stakwin2,0x0b8c,0,          READ_WORD(&neogeo_ram[0x0002]))
  339. static READ_HANDLER( bakatono_cycle_r )
  340. {
  341.         int mem;
  342.         if (cpu_get_pc()==0x197cc)
  343.         {
  344.                 cpu_spinuntil_int();
  345.                 mem=READ_WORD(&neogeo_ram[0x00fa]);
  346.                 mem--;
  347.                 WRITE_WORD(&neogeo_ram[0x00fa],mem);
  348.                 return mem;
  349.         }
  350.         return READ_WORD(&neogeo_ram[0x00fa]);
  351. }
  352. NEO_CYCLE_R(quizkof,0x0450,0,           READ_WORD(&neogeo_ram[0x4464]))
  353. NEO_CYCLE_R(quizdais,   0x0730,0,       READ_WORD(&neogeo_ram[0x59f2]))
  354. NEO_CYCLE_R(quizdai2,   0x1afa,0xffff,  READ_WORD(&neogeo_ram[0x0960]))
  355. NEO_CYCLE_R(popbounc,   0x1196,0xffff,  READ_WORD(&neogeo_ram[0x1008]))
  356. NEO_CYCLE_R(sdodgeb,    0xc22e,0,       READ_WORD(&neogeo_ram[0x1104]))
  357. NEO_CYCLE_R(shocktr2,   0xf410,0,       READ_WORD(&neogeo_ram[0x8348]))
  358. NEO_CYCLE_R(figfever,   0x20c60,0,      READ_WORD(&neogeo_ram[0x8100]))
  359. NEO_CYCLE_R(irrmaze,    0x104e,0,       READ_WORD(&neogeo_ram[0x4b6e]))
  360.  
  361. /******************************************************************************/
  362. /* Routines to speed up the sound processor AVDB 24-10-1998              */
  363. /******************************************************************************/
  364.  
  365. /*
  366.  *    Sound V3.0
  367.  *
  368.  *    Used by puzzle de pon and Super Sidekicks 2
  369.  *
  370.  */
  371. static READ_HANDLER( cycle_v3_sr )
  372. {
  373.     unsigned char *RAM = memory_region(REGION_CPU2);
  374.  
  375.     if (cpu_get_pc()==0x0137) {
  376.         cpu_spinuntil_int();
  377.         return RAM[0xfeb1];
  378.     }
  379.     return RAM[0xfeb1];
  380. }
  381.  
  382. /*
  383.  *    Also sound revision no 3.0, but different types.
  384.  */
  385. static READ_HANDLER( ssideki_cycle_sr )
  386. {
  387.     unsigned char *RAM = memory_region(REGION_CPU2);
  388.  
  389.     if (cpu_get_pc()==0x015A) {
  390.         cpu_spinuntil_int();
  391.         return RAM[0xfef3];
  392.     }
  393.     return RAM[0xfef3];
  394. }
  395.  
  396. static READ_HANDLER( aof_cycle_sr )
  397. {
  398.     unsigned char *RAM = memory_region(REGION_CPU2);
  399.  
  400.     if (cpu_get_pc()==0x0143) {
  401.         cpu_spinuntil_int();
  402.         return RAM[0xfef3];
  403.     }
  404.     return RAM[0xfef3];
  405. }
  406.  
  407. /*
  408.  *    Sound V2.0
  409.  *
  410.  *    Used by puzzle Bobble and Goal Goal Goal
  411.  *
  412.  */
  413.  
  414. static READ_HANDLER( cycle_v2_sr )
  415. {
  416.     unsigned char *RAM = memory_region(REGION_CPU2);
  417.  
  418.     if (cpu_get_pc()==0x0143) {
  419.         cpu_spinuntil_int();
  420.         return RAM[0xfeef];
  421.     }
  422.     return RAM[0xfeef];
  423. }
  424.  
  425. static READ_HANDLER( vwpoint_cycle_sr )
  426. {
  427.     unsigned char *RAM = memory_region(REGION_CPU2);
  428.  
  429.     if (cpu_get_pc()==0x0143) {
  430.         cpu_spinuntil_int();
  431.         return RAM[0xfe46];
  432.     }
  433.     return RAM[0xfe46];
  434. }
  435.  
  436. /*
  437.  *    Sound revision no 1.5, and some 2.0 versions,
  438.  *    are not fit for speedups, it results in sound drops !
  439.  *    Games that use this one are : Ghost Pilots, Joy Joy, Nam 1975
  440.  */
  441.  
  442. /*
  443. static READ_HANDLER( cycle_v15_sr )
  444. {
  445.     unsigned char *RAM = memory_region(REGION_CPU2);
  446.  
  447.     if (cpu_get_pc()==0x013D) {
  448.         cpu_spinuntil_int();
  449.         return RAM[0xfe46];
  450.     }
  451.     return RAM[0xfe46];
  452. }
  453. */
  454.  
  455. /*
  456.  *    Magician Lord uses a different sound core from all other
  457.  *    Neo Geo Games.
  458.  */
  459.  
  460. static READ_HANDLER( maglord_cycle_sr )
  461. {
  462.     unsigned char *RAM = memory_region(REGION_CPU2);
  463.  
  464.     if (cpu_get_pc()==0xd487) {
  465.         cpu_spinuntil_int();
  466.         return RAM[0xfb91];
  467.     }
  468.     return RAM[0xfb91];
  469. }
  470.  
  471. /******************************************************************************/
  472.  
  473. static int prot_data;
  474.  
  475. static READ_HANDLER( fatfury2_protection_r )
  476. {
  477.     int res = (prot_data >> 24) & 0xff;
  478.  
  479.     switch (offset)
  480.     {
  481.         case 0x55550:
  482.         case 0xffff0:
  483.         case 0x00000:
  484.         case 0xff000:
  485.         case 0x36000:
  486.         case 0x36008:
  487.             return res;
  488.  
  489.         case 0x36004:
  490.         case 0x3600c:
  491.             return ((res & 0xf0) >> 4) | ((res & 0x0f) << 4);
  492.  
  493.         default:
  494. logerror("unknown protection read at pc %06x, offset %08x\n",cpu_get_pc(),offset);
  495.             return 0;
  496.     }
  497. }
  498.  
  499. static WRITE_HANDLER( fatfury2_protection_w )
  500. {
  501.     switch (offset)
  502.     {
  503.         case 0x55552:    /* data == 0x5555; read back from 55550, ffff0, 00000, ff000 */
  504.             prot_data = 0xff00ff00;
  505.             break;
  506.  
  507.         case 0x56782:    /* data == 0x1234; read back from 36000 *or* 36004 */
  508.             prot_data = 0xf05a3601;
  509.             break;
  510.  
  511.         case 0x42812:    /* data == 0x1824; read back from 36008 *or* 3600c */
  512.             prot_data = 0x81422418;
  513.             break;
  514.  
  515.         case 0x55550:
  516.         case 0xffff0:
  517.         case 0xff000:
  518.         case 0x36000:
  519.         case 0x36004:
  520.         case 0x36008:
  521.         case 0x3600c:
  522.             prot_data <<= 8;
  523.             break;
  524.  
  525.         default:
  526. logerror("unknown protection write at pc %06x, offset %08x, data %02x\n",cpu_get_pc(),offset,data);
  527.             break;
  528.     }
  529. }
  530.  
  531. static READ_HANDLER( popbounc_sfix_r )
  532. {
  533.         if (cpu_get_pc()==0x6b10) {return 0;}
  534.         return READ_WORD(&neogeo_ram[0x4fbc]);
  535. }
  536.  
  537. static void neogeo_custom_memory(void)
  538. {
  539.     /* NeoGeo intro screen cycle skip, used by all games */
  540. //    install_mem_read_handler(0, 0x10fe8c, 0x10fe8d, bios_cycle_skip_r);
  541.  
  542.     /* Individual games can go here... */
  543.  
  544. #if 1
  545. //    if (!strcmp(Machine->gamedrv->name,"joyjoy"))   install_mem_read_handler(0, 0x100554, 0x100555, joyjoy_cycle_r);    // Slower
  546. //    if (!strcmp(Machine->gamedrv->name,"ridhero"))  install_mem_read_handler(0, 0x1000ca, 0x1000cb, ridhero_cycle_r);
  547.     if (!strcmp(Machine->gamedrv->name,"bstars"))   install_mem_read_handler(0, 0x10000a, 0x10000b, bstars_cycle_r);
  548.     if (!strcmp(Machine->gamedrv->name,"cyberlip")) install_mem_read_handler(0, 0x107bb4, 0x107bb4, cyberlip_cycle_r);
  549.     if (!strcmp(Machine->gamedrv->name,"lbowling")) install_mem_read_handler(0, 0x100098, 0x100099, lbowling_cycle_r);
  550.     if (!strcmp(Machine->gamedrv->name,"superspy")) install_mem_read_handler(0, 0x10108c, 0x10108d, superspy_cycle_r);
  551.     if (!strcmp(Machine->gamedrv->name,"ttbb"))     install_mem_read_handler(0, 0x10000e, 0x10000f, ttbb_cycle_r);
  552.     if (!strcmp(Machine->gamedrv->name,"alpham2"))  install_mem_read_handler(0, 0x10e2fe, 0x10e2ff, alpham2_cycle_r);    // Very little increase.
  553.     if (!strcmp(Machine->gamedrv->name,"eightman")) install_mem_read_handler(0, 0x10046e, 0x10046f, eightman_cycle_r);
  554.     if (!strcmp(Machine->gamedrv->name,"roboarmy")) install_mem_read_handler(0, 0x104010, 0x104011, roboarmy_cycle_r);
  555.     if (!strcmp(Machine->gamedrv->name,"fatfury1")) install_mem_read_handler(0, 0x104282, 0x104283, fatfury1_cycle_r);
  556.     if (!strcmp(Machine->gamedrv->name,"burningf")) install_mem_read_handler(0, 0x10000e, 0x10000f, burningf_cycle_r);
  557.     if (!strcmp(Machine->gamedrv->name,"kotm"))     install_mem_read_handler(0, 0x100020, 0x100021, kotm_cycle_r);
  558.     if (!strcmp(Machine->gamedrv->name,"gpilots"))  install_mem_read_handler(0, 0x10a682, 0x10a683, gpilots_cycle_r);
  559.     if (!strcmp(Machine->gamedrv->name,"lresort"))  install_mem_read_handler(0, 0x104102, 0x104103, lresort_cycle_r);
  560.     if (!strcmp(Machine->gamedrv->name,"fbfrenzy")) install_mem_read_handler(0, 0x100020, 0x100021, fbfrenzy_cycle_r);
  561.     if (!strcmp(Machine->gamedrv->name,"socbrawl")) install_mem_read_handler(0, 0x10b20c, 0x10b20d, socbrawl_cycle_r);
  562.     if (!strcmp(Machine->gamedrv->name,"mutnat"))   install_mem_read_handler(0, 0x101042, 0x101043, mutnat_cycle_r);
  563.     if (!strcmp(Machine->gamedrv->name,"aof"))      install_mem_read_handler(0, 0x108100, 0x108101, aof_cycle_r);
  564. //    if (!strcmp(Machine->gamedrv->name,"countb"))   install_mem_read_handler(0, 0x108002, 0x108003, countb_cycle_r);   // doesn't seem to speed it up.
  565.     if (!strcmp(Machine->gamedrv->name,"ncombat"))  install_mem_read_handler(0, 0x100206, 0x100207, ncombat_cycle_r);
  566. //**    if (!strcmp(Machine->gamedrv->name,"crsword"))  install_mem_read_handler(0, 0x10, 0x10, crsword_cycle_r);            // Can't find this one :-(
  567.     if (!strcmp(Machine->gamedrv->name,"trally"))   install_mem_read_handler(0, 0x100206, 0x100207, trally_cycle_r);
  568.     if (!strcmp(Machine->gamedrv->name,"sengoku"))  install_mem_read_handler(0, 0x100088, 0x100089, sengoku_cycle_r);
  569. //    if (!strcmp(Machine->gamedrv->name,"ncommand")) install_mem_read_handler(0, 0x108206, 0x108207, ncommand_cycle_r);    // Slower
  570.     if (!strcmp(Machine->gamedrv->name,"wh1"))      install_mem_read_handler(0, 0x108206, 0x108207, wh1_cycle_r);
  571. //**    if (!strcmp(Machine->gamedrv->name,"sengoku2")) install_mem_read_handler(0, 0x10, 0x10, sengoku2_cycle_r);
  572.     if (!strcmp(Machine->gamedrv->name,"androdun")) install_mem_read_handler(0, 0x100080, 0x100081, androdun_cycle_r);
  573.     if (!strcmp(Machine->gamedrv->name,"bjourney")) install_mem_read_handler(0, 0x100206, 0x100207, bjourney_cycle_r);
  574.     if (!strcmp(Machine->gamedrv->name,"maglord"))  install_mem_read_handler(0, 0x100206, 0x100207, maglord_cycle_r);
  575. //    if (!strcmp(Machine->gamedrv->name,"janshin"))  install_mem_read_handler(0, 0x100026, 0x100027, janshin_cycle_r);    // No speed difference
  576.     if (!strcmp(Machine->gamedrv->name,"pulstar"))  install_mem_read_handler(0, 0x101000, 0x101001, pulstar_cycle_r);
  577.     if (!strcmp(Machine->gamedrv->name,"blazstar")) install_mem_read_handler(0, 0x101000, 0x101001, blazstar_cycle_r);
  578. //**    if (!strcmp(Machine->gamedrv->name,"pbobble"))  install_mem_read_handler(0, 0x10, 0x10, pbobble_cycle_r);        // Can't find this one :-(
  579.     if (!strcmp(Machine->gamedrv->name,"puzzledp")) install_mem_read_handler(0, 0x100000, 0x100001, puzzledp_cycle_r);
  580.     if (!strcmp(Machine->gamedrv->name,"neodrift")) install_mem_read_handler(0, 0x100424, 0x100425, neodrift_cycle_r);
  581. //**    if (!strcmp(Machine->gamedrv->name,"neomrdo"))  install_mem_read_handler(0, 0x10, 0x10, neomrdo_cycle_r);        // Can't find this one :-(
  582.     if (!strcmp(Machine->gamedrv->name,"spinmast")) install_mem_read_handler(0, 0x100050, 0x100051, spinmast_cycle_r);
  583.     if (!strcmp(Machine->gamedrv->name,"karnovr"))  install_mem_read_handler(0, 0x103466, 0x103467, karnovr_cycle_r);
  584.     if (!strcmp(Machine->gamedrv->name,"wjammers")) install_mem_read_handler(0, 0x10005a, 0x10005b, wjammers_cycle_r);
  585.     if (!strcmp(Machine->gamedrv->name,"strhoops")) install_mem_read_handler(0, 0x101200, 0x101201, strhoops_cycle_r);
  586. //    if (!strcmp(Machine->gamedrv->name,"magdrop3")) install_mem_read_handler(0, 0x100060, 0x100061, magdrop3_cycle_r);    // The game starts glitching.
  587. //**    if (!strcmp(Machine->gamedrv->name,"pspikes2")) install_mem_read_handler(0, 0x10, 0x10, pspikes2_cycle_r);        // Can't find this one :-(
  588.     if (!strcmp(Machine->gamedrv->name,"sonicwi2")) install_mem_read_handler(0, 0x10e5b6, 0x10e5b7, sonicwi2_cycle_r);
  589.     if (!strcmp(Machine->gamedrv->name,"sonicwi3")) install_mem_read_handler(0, 0x10ea2e, 0x10ea2f, sonicwi3_cycle_r);
  590.     if (!strcmp(Machine->gamedrv->name,"goalx3"))   install_mem_read_handler(0, 0x100006, 0x100007, goalx3_cycle_r);
  591. //    if (!strcmp(Machine->gamedrv->name,"mslug"))    install_mem_read_handler(0, 0x106ed8, 0x106ed9, mslug_cycle_r);        // Doesn't work properly.
  592. //    if (!strcmp(Machine->gamedrv->name,"turfmast")) install_mem_read_handler(0, 0x102e54, 0x102e55, turfmast_cycle_r);
  593.     if (!strcmp(Machine->gamedrv->name,"kabukikl")) install_mem_read_handler(0, 0x10428a, 0x10428b, kabukikl_cycle_r);
  594.  
  595.     if (!strcmp(Machine->gamedrv->name,"panicbom")) install_mem_read_handler(0, 0x10009c, 0x10009d, panicbom_cycle_r);
  596.     if (!strcmp(Machine->gamedrv->name,"neobombe")) install_mem_read_handler(0, 0x10448c, 0x10448d, neobombe_cycle_r);
  597.     if (!strcmp(Machine->gamedrv->name,"wh2"))      install_mem_read_handler(0, 0x108206, 0x108207, wh2_cycle_r);
  598.     if (!strcmp(Machine->gamedrv->name,"wh2j"))     install_mem_read_handler(0, 0x108206, 0x108207, wh2j_cycle_r);
  599.     if (!strcmp(Machine->gamedrv->name,"aodk"))     install_mem_read_handler(0, 0x108206, 0x108207, aodk_cycle_r);
  600.     if (!strcmp(Machine->gamedrv->name,"whp"))      install_mem_read_handler(0, 0x108206, 0x108207, whp_cycle_r);
  601.     if (!strcmp(Machine->gamedrv->name,"overtop"))  install_mem_read_handler(0, 0x108202, 0x108203, overtop_cycle_r);
  602.     if (!strcmp(Machine->gamedrv->name,"twinspri")) install_mem_read_handler(0, 0x108206, 0x108207, twinspri_cycle_r);
  603.     if (!strcmp(Machine->gamedrv->name,"stakwin"))  install_mem_read_handler(0, 0x100b92, 0x100b93, stakwin_cycle_r);
  604.     if (!strcmp(Machine->gamedrv->name,"shocktro")) install_mem_read_handler(0, 0x108344, 0x108345, shocktro_cycle_r);
  605.     if (!strcmp(Machine->gamedrv->name,"tws96"))    install_mem_read_handler(0, 0x10010e, 0x10010f, tws96_cycle_r);
  606. //    if (!strcmp(Machine->gamedrv->name,"zedblade")) install_mem_read_handler(0, 0x109004, 0x109005, zedblade_cycle_r);
  607. //    if (!strcmp(Machine->gamedrv->name,"doubledr")) install_mem_read_handler(0, 0x101c30, 0x101c31, doubledr_cycle_r);
  608. //**    if (!strcmp(Machine->gamedrv->name,"gowcaizr")) install_mem_read_handler(0, 0x10, 0x10, gowcaizr_cycle_r);        // Can't find this one :-(
  609.     if (!strcmp(Machine->gamedrv->name,"galaxyfg")) install_mem_read_handler(0, 0x101858, 0x101859, galaxyfg_cycle_r);
  610.     if (!strcmp(Machine->gamedrv->name,"wakuwak7")) install_mem_read_handler(0, 0x100bd4, 0x100bd5, wakuwak7_cycle_r);
  611.     if (!strcmp(Machine->gamedrv->name,"mahretsu")) install_mem_read_handler(0, 0x1013b2, 0x1013b3, mahretsu_cycle_r);
  612.     if (!strcmp(Machine->gamedrv->name,"nam1975"))  install_mem_read_handler(0, 0x1012e0, 0x1012e1, nam1975_cycle_r);
  613.     if (!strcmp(Machine->gamedrv->name,"tpgolf"))   install_mem_read_handler(0, 0x1000a4, 0x1000a5, tpgolf_cycle_r);
  614.     if (!strcmp(Machine->gamedrv->name,"legendos")) install_mem_read_handler(0, 0x100002, 0x100003, legendos_cycle_r);
  615. //    if (!strcmp(Machine->gamedrv->name,"viewpoin")) install_mem_read_handler(0, 0x101216, 0x101217, viewpoin_cycle_r);    // Doesn't work
  616.     if (!strcmp(Machine->gamedrv->name,"fatfury2")) install_mem_read_handler(0, 0x10418c, 0x10418d, fatfury2_cycle_r);
  617.     if (!strcmp(Machine->gamedrv->name,"bstars2"))  install_mem_read_handler(0, 0x10001c, 0x10001c, bstars2_cycle_r);
  618.     if (!strcmp(Machine->gamedrv->name,"ssideki"))  install_mem_read_handler(0, 0x108c84, 0x108c85, ssideki_cycle_r);
  619.     if (!strcmp(Machine->gamedrv->name,"kotm2"))    install_mem_read_handler(0, 0x101000, 0x101001, kotm2_cycle_r);
  620.     if (!strcmp(Machine->gamedrv->name,"samsho"))   install_mem_read_handler(0, 0x100a76, 0x100a77, samsho_cycle_r);
  621.     if (!strcmp(Machine->gamedrv->name,"fatfursp")) install_mem_read_handler(0, 0x10418c, 0x10418d, fatfursp_cycle_r);
  622.     if (!strcmp(Machine->gamedrv->name,"fatfury3")) install_mem_read_handler(0, 0x10418c, 0x10418d, fatfury3_cycle_r);
  623.     if (!strcmp(Machine->gamedrv->name,"tophuntr")) install_mem_read_handler(0, 0x10008e, 0x10008f, tophuntr_cycle_r);    // Can't test this at the moment, it crashes.
  624.     if (!strcmp(Machine->gamedrv->name,"savagere")) install_mem_read_handler(0, 0x108404, 0x108405, savagere_cycle_r);
  625. //    if (!strcmp(Machine->gamedrv->name,"kof94"))    install_mem_read_handler(0, 0x10, 0x10, kof94_cycle_r);                // Can't do this I think. There seems to be too much code in the idle loop.
  626.     if (!strcmp(Machine->gamedrv->name,"aof2"))     install_mem_read_handler(0, 0x108280, 0x108281, aof2_cycle_r);
  627. //    if (!strcmp(Machine->gamedrv->name,"ssideki2")) install_mem_read_handler(0, 0x104292, 0x104293, ssideki2_cycle_r);
  628.     if (!strcmp(Machine->gamedrv->name,"samsho2"))  install_mem_read_handler(0, 0x100a30, 0x100a31, samsho2_cycle_r);
  629.     if (!strcmp(Machine->gamedrv->name,"samsho3"))  install_mem_read_handler(0, 0x108408, 0x108409, samsho3_cycle_r);
  630.     if (!strcmp(Machine->gamedrv->name,"kof95"))    install_mem_read_handler(0, 0x10a784, 0x10a785, kof95_cycle_r);
  631.     if (!strcmp(Machine->gamedrv->name,"rbff1"))    install_mem_read_handler(0, 0x10418c, 0x10418d, rbff1_cycle_r);
  632. //    if (!strcmp(Machine->gamedrv->name,"aof3"))     install_mem_read_handler(0, 0x104ee8, 0x104ee9, aof3_cycle_r);        // Doesn't work properly.
  633.     if (!strcmp(Machine->gamedrv->name,"ninjamas")) install_mem_read_handler(0, 0x108206, 0x108207, ninjamas_cycle_r);
  634.     if (!strcmp(Machine->gamedrv->name,"kof96"))    install_mem_read_handler(0, 0x10a782, 0x10a783, kof96_cycle_r);
  635.     if (!strcmp(Machine->gamedrv->name,"samsho4"))  install_mem_read_handler(0, 0x10830c, 0x10830d, samsho4_cycle_r);
  636.     if (!strcmp(Machine->gamedrv->name,"rbffspec")) install_mem_read_handler(0, 0x10418c, 0x10418d, rbffspec_cycle_r);
  637.     if (!strcmp(Machine->gamedrv->name,"kizuna"))   install_mem_read_handler(0, 0x108808, 0x108809, kizuna_cycle_r);
  638.     if (!strcmp(Machine->gamedrv->name,"kof97"))    install_mem_read_handler(0, 0x10a784, 0x10a785, kof97_cycle_r);
  639. //    if (!strcmp(Machine->gamedrv->name,"mslug2"))   install_mem_read_handler(0, 0x10008c, 0x10008d, mslug2_cycle_r);    // Breaks the game
  640.     if (!strcmp(Machine->gamedrv->name,"rbff2"))    install_mem_read_handler(0, 0x10418c, 0x10418d, rbff2_cycle_r);
  641.     if (!strcmp(Machine->gamedrv->name,"ragnagrd")) install_mem_read_handler(0, 0x100042, 0x100043, ragnagrd_cycle_r);
  642.     if (!strcmp(Machine->gamedrv->name,"lastblad")) install_mem_read_handler(0, 0x109d4e, 0x109d4f, lastblad_cycle_r);
  643.     if (!strcmp(Machine->gamedrv->name,"gururin"))  install_mem_read_handler(0, 0x101002, 0x101003, gururin_cycle_r);
  644. //    if (!strcmp(Machine->gamedrv->name,"magdrop2")) install_mem_read_handler(0, 0x100064, 0x100065, magdrop2_cycle_r);    // Graphic Glitches
  645. //    if (!strcmp(Machine->gamedrv->name,"miexchng")) install_mem_read_handler(0, 0x10, 0x10, miexchng_cycle_r);            // Can't do this.
  646.     if (!strcmp(Machine->gamedrv->name,"kof98"))    install_mem_read_handler(0, 0x10a784, 0x10a785, kof98_cycle_r);
  647.     if (!strcmp(Machine->gamedrv->name,"marukodq")) install_mem_read_handler(0, 0x100210, 0x100211, marukodq_cycle_r);
  648.     if (!strcmp(Machine->gamedrv->name,"minasan"))  install_mem_read_handler(0, 0x1000ca, 0x1000cb, minasan_cycle_r);
  649.     if (!strcmp(Machine->gamedrv->name,"stakwin2")) install_mem_read_handler(0, 0x100002, 0x100003, stakwin2_cycle_r);
  650.     if (!strcmp(Machine->gamedrv->name,"bakatono")) install_mem_read_handler(0, 0x1000fa, 0x1000fb, bakatono_cycle_r);
  651.     if (!strcmp(Machine->gamedrv->name,"quizkof"))  install_mem_read_handler(0, 0x104464, 0x104465, quizkof_cycle_r);
  652.     if (!strcmp(Machine->gamedrv->name,"quizdais")) install_mem_read_handler(0, 0x1059f2, 0x1059f3, quizdais_cycle_r);
  653.     if (!strcmp(Machine->gamedrv->name,"quizdai2")) install_mem_read_handler(0, 0x100960, 0x100961, quizdai2_cycle_r);
  654.     if (!strcmp(Machine->gamedrv->name,"popbounc")) install_mem_read_handler(0, 0x101008, 0x101009, popbounc_cycle_r);
  655.     if (!strcmp(Machine->gamedrv->name,"sdodgeb"))  install_mem_read_handler(0, 0x101104, 0x101105, sdodgeb_cycle_r);
  656.     if (!strcmp(Machine->gamedrv->name,"shocktr2")) install_mem_read_handler(0, 0x108348, 0x108349, shocktr2_cycle_r);
  657.     if (!strcmp(Machine->gamedrv->name,"figfever")) install_mem_read_handler(0, 0x108100, 0x108101, figfever_cycle_r);
  658.     if (!strcmp(Machine->gamedrv->name,"irrmaze"))  install_mem_read_handler(0, 0x104b6e, 0x104b6f, irrmaze_cycle_r);
  659.  
  660. #endif
  661.  
  662.     /* AVDB cpu spins based on sound processor status */
  663.     if (!strcmp(Machine->gamedrv->name,"puzzledp")) install_mem_read_handler(1, 0xfeb1, 0xfeb1, cycle_v3_sr);
  664. //    if (!strcmp(Machine->gamedrv->name,"ssideki2")) install_mem_read_handler(1, 0xfeb1, 0xfeb1, cycle_v3_sr);
  665.  
  666.     if (!strcmp(Machine->gamedrv->name,"ssideki"))  install_mem_read_handler(1, 0xfef3, 0xfef3, ssideki_cycle_sr);
  667.     if (!strcmp(Machine->gamedrv->name,"aof"))      install_mem_read_handler(1, 0xfef3, 0xfef3, aof_cycle_sr);
  668.  
  669.     if (!strcmp(Machine->gamedrv->name,"pbobble")) install_mem_read_handler(1, 0xfeef, 0xfeef, cycle_v2_sr);
  670.     if (!strcmp(Machine->gamedrv->name,"goalx3")) install_mem_read_handler(1, 0xfeef, 0xfeef, cycle_v2_sr);
  671.     if (!strcmp(Machine->gamedrv->name,"fatfury1")) install_mem_read_handler(1, 0xfeef, 0xfeef, cycle_v2_sr);
  672.     if (!strcmp(Machine->gamedrv->name,"mutnat")) install_mem_read_handler(1, 0xfeef, 0xfeef, cycle_v2_sr);
  673.  
  674.     if (!strcmp(Machine->gamedrv->name,"maglord")) install_mem_read_handler(1, 0xfb91, 0xfb91, maglord_cycle_sr);
  675.     if (!strcmp(Machine->gamedrv->name,"vwpoint")) install_mem_read_handler(1, 0xfe46, 0xfe46, vwpoint_cycle_sr);
  676.  
  677. //    if (!strcmp(Machine->gamedrv->name,"joyjoy")) install_mem_read_handler(1, 0xfe46, 0xfe46, cycle_v15_sr);
  678. //    if (!strcmp(Machine->gamedrv->name,"nam1975")) install_mem_read_handler(1, 0xfe46, 0xfe46, cycle_v15_sr);
  679. //    if (!strcmp(Machine->gamedrv->name,"gpilots")) install_mem_read_handler(1, 0xfe46, 0xfe46, cycle_v15_sr);
  680.  
  681.     /* kludges */
  682.  
  683.     if (!strcmp(Machine->gamedrv->name,"gururin"))
  684.     {
  685.         /* Fix a really weird problem. The game clears the video RAM but goes */
  686.         /* beyond the tile RAM, corrupting the zoom control RAM. After that it */
  687.         /* initializes the control RAM, but then corrupts it again! */
  688.         unsigned char *RAM = memory_region(REGION_CPU1);
  689.         WRITE_WORD(&RAM[0x1328],0x4e71);
  690.         WRITE_WORD(&RAM[0x132a],0x4e71);
  691.         WRITE_WORD(&RAM[0x132c],0x4e71);
  692.         WRITE_WORD(&RAM[0x132e],0x4e71);
  693.     }
  694.  
  695.     if (!Machine->sample_rate &&
  696.             !strcmp(Machine->gamedrv->name,"popbounc"))
  697.     /* the game hangs after a while without this patch */
  698.         install_mem_read_handler(0, 0x104fbc, 0x104fbd, popbounc_sfix_r);
  699.  
  700.     /* hacks to make the games which do protection checks run in arcade mode */
  701.     /* we write protect a SRAM location so it cannot be set to 1 */
  702.     sram_protection_hack = -1;
  703.     if (!strcmp(Machine->gamedrv->name,"fatfury3") ||
  704.              !strcmp(Machine->gamedrv->name,"samsho3") ||
  705.              !strcmp(Machine->gamedrv->name,"samsho4") ||
  706.              !strcmp(Machine->gamedrv->name,"aof3") ||
  707.              !strcmp(Machine->gamedrv->name,"rbff1") ||
  708.              !strcmp(Machine->gamedrv->name,"rbffspec") ||
  709.              !strcmp(Machine->gamedrv->name,"kof95") ||
  710.              !strcmp(Machine->gamedrv->name,"kof96") ||
  711.              !strcmp(Machine->gamedrv->name,"kof97") ||
  712.              !strcmp(Machine->gamedrv->name,"kof98") ||
  713.              !strcmp(Machine->gamedrv->name,"kof99") ||
  714.              !strcmp(Machine->gamedrv->name,"kizuna") ||
  715.              !strcmp(Machine->gamedrv->name,"lastblad") ||
  716.              !strcmp(Machine->gamedrv->name,"lastbld2") ||
  717.              !strcmp(Machine->gamedrv->name,"rbff2") ||
  718.              !strcmp(Machine->gamedrv->name,"mslug2") ||
  719.              !strcmp(Machine->gamedrv->name,"garou"))
  720.         sram_protection_hack = 0x100;
  721.  
  722.     if (!strcmp(Machine->gamedrv->name,"pulstar"))
  723.         sram_protection_hack = 0x35a;
  724.  
  725.     if (!strcmp(Machine->gamedrv->name,"ssideki"))
  726.     {
  727.         /* patch out protection check */
  728.         /* the protection routines are at 0x25dcc and involve reading and writing */
  729.         /* addresses in the 0x2xxxxx range */
  730.         unsigned char *RAM = memory_region(REGION_CPU1);
  731.         WRITE_WORD(&RAM[0x2240],0x4e71);
  732.     }
  733.  
  734.     /* Hacks the program rom of Fatal Fury 2, needed either in arcade or console mode */
  735.     /* otherwise at level 2 you cannot hit the opponent and other problems */
  736.     if (!strcmp(Machine->gamedrv->name,"fatfury2"))
  737.     {
  738.         /* there seems to also be another protection check like the countless ones */
  739.         /* patched above by protectiong a SRAM location, but that trick doesn't work */
  740.         /* here (or maybe the SRAM location to protect is different), so I patch out */
  741.         /* the routine which trashes memory. Without this, the game goes nuts after */
  742.         /* the first bonus stage. */
  743.         unsigned char *RAM = memory_region(REGION_CPU1);
  744.         WRITE_WORD(&RAM[0xb820],0x4e71);
  745.         WRITE_WORD(&RAM[0xb822],0x4e71);
  746.  
  747.         /* again, the protection involves reading and writing addresses in the */
  748.         /* 0x2xxxxx range. There are several checks all around the code. */
  749.         install_mem_read_handler (0, 0x200000, 0x2fffff, fatfury2_protection_r);
  750.         install_mem_write_handler(0, 0x200000, 0x2fffff, fatfury2_protection_w);
  751.     }
  752.  
  753.     if (!strcmp(Machine->gamedrv->name,"fatfury3"))
  754.     {
  755.         /* patch the first word, it must be 0x0010 not 0x0000 (initial stack pointer) */
  756.         unsigned char *RAM = memory_region(REGION_CPU1);
  757.         WRITE_WORD(&RAM[0x0000],0x0010);
  758.     }
  759.  
  760.     if (!strcmp(Machine->gamedrv->name,"mslugx"))
  761.     {
  762.         /* patch out protection checks */
  763.         int i;
  764.         unsigned char *RAM = memory_region(REGION_CPU1);
  765.  
  766.         for (i = 0;i < 0x100000;i+=2)
  767.         {
  768.             if (READ_WORD(&RAM[i+0]) == 0x0243 &&
  769.                 READ_WORD(&RAM[i+2]) == 0x0001 &&    /* andi.w  #$1, D3 */
  770.                 READ_WORD(&RAM[i+4]) == 0x6600)        /* bne xxxx */
  771.             {
  772.                 WRITE_WORD(&RAM[i+4],0x4e71);
  773.                 WRITE_WORD(&RAM[i+6],0x4e71);
  774.             }
  775.         }
  776.  
  777.         WRITE_WORD(&RAM[0x3bdc],0x4e71);
  778.         WRITE_WORD(&RAM[0x3bde],0x4e71);
  779.         WRITE_WORD(&RAM[0x3be0],0x4e71);
  780.         WRITE_WORD(&RAM[0x3c0c],0x4e71);
  781.         WRITE_WORD(&RAM[0x3c0e],0x4e71);
  782.         WRITE_WORD(&RAM[0x3c10],0x4e71);
  783.  
  784.         WRITE_WORD(&RAM[0x3c36],0x4e71);
  785.         WRITE_WORD(&RAM[0x3c38],0x4e71);
  786.     }
  787. }
  788.  
  789.  
  790.  
  791. WRITE_HANDLER( neogeo_sram_lock_w )
  792. {
  793.     sram_locked = 1;
  794. }
  795.  
  796. WRITE_HANDLER( neogeo_sram_unlock_w )
  797. {
  798.     sram_locked = 0;
  799. }
  800.  
  801. READ_HANDLER( neogeo_sram_r )
  802. {
  803.     return READ_WORD(&neogeo_sram[offset]);
  804. }
  805.  
  806. WRITE_HANDLER( neogeo_sram_w )
  807. {
  808.     if (sram_locked)
  809.     {
  810. logerror("PC %06x: warning: write %02x to SRAM %04x while it was protected\n",cpu_get_pc(),data,offset);
  811.     }
  812.     else
  813.     {
  814.         if (offset == sram_protection_hack)
  815.         {
  816.             if (data == 0x0001 || data == 0xff000001)
  817.                 return;    /* fake protection pass */
  818.         }
  819.  
  820.         COMBINE_WORD_MEM(&neogeo_sram[offset],data);
  821.     }
  822. }
  823.  
  824. void neogeo_nvram_handler(void *file,int read_or_write)
  825. {
  826.     if (read_or_write)
  827.     {
  828.         /* Save the SRAM settings */
  829.         osd_fwrite_msbfirst(file,neogeo_sram,0x2000);
  830.  
  831.         /* save the memory card */
  832.         neogeo_memcard_save();
  833.     }
  834.     else
  835.     {
  836.         /* Load the SRAM settings for this game */
  837.         if (file)
  838.             osd_fread_msbfirst(file,neogeo_sram,0x2000);
  839.         else
  840.             memset(neogeo_sram,0,0x10000);
  841.  
  842.         /* load the memory card */
  843.         neogeo_memcard_load(memcard_number);
  844.     }
  845. }
  846.  
  847.  
  848.  
  849. /*
  850.     INFORMATION:
  851.  
  852.     Memory card is a 2kb battery backed RAM.
  853.     It is accessed thru 0x800000-0x800FFF.
  854.     Even bytes are always 0xFF
  855.     Odd bytes are memcard data (0x800 bytes)
  856.  
  857.     Status byte at 0x380000: (BITS ARE ACTIVE *LOW*)
  858.  
  859.     0 PAD1 START
  860.     1 PAD1 SELECT
  861.     2 PAD2 START
  862.     3 PAD2 SELECT
  863.     4 --\  MEMORY CARD
  864.     5 --/  INSERTED
  865.     6 MEMORY CARD WRITE PROTECTION
  866.     7 UNUSED (?)
  867. */
  868.  
  869.  
  870.  
  871.  
  872. /********************* MEMCARD ROUTINES **********************/
  873. READ_HANDLER(     neogeo_memcard_r )
  874. {
  875.     if (memcard_status==1)
  876.     {
  877.         return (neogeo_memcard[offset>>1]|0xFF00);
  878.     }
  879.     else
  880.         return 0xFFFF;
  881. }
  882.  
  883. WRITE_HANDLER( neogeo_memcard_w )
  884. {
  885.     if (memcard_status==1)
  886.     {
  887.         neogeo_memcard[offset>>1] = (data&0xFF);
  888.     }
  889. }
  890.  
  891. int    neogeo_memcard_load(int number)
  892. {
  893.     char name[16];
  894.     void *f;
  895.  
  896.     sprintf(name, "MEMCARD.%03d", number);
  897.     if ((f=osd_fopen(0, name, OSD_FILETYPE_MEMCARD,0))!=0)
  898.     {
  899.         osd_fread(f,neogeo_memcard,0x800);
  900.         osd_fclose(f);
  901.         return 1;
  902.     }
  903.     return 0;
  904. }
  905.  
  906. void    neogeo_memcard_save(void)
  907. {
  908.     char name[16];
  909.     void *f;
  910.  
  911.     if (memcard_number!=-1)
  912.     {
  913.         sprintf(name, "MEMCARD.%03d", memcard_number);
  914.         if ((f=osd_fopen(0, name, OSD_FILETYPE_MEMCARD,1))!=0)
  915.         {
  916.             osd_fwrite(f,neogeo_memcard,0x800);
  917.             osd_fclose(f);
  918.         }
  919.     }
  920. }
  921.  
  922. void    neogeo_memcard_eject(void)
  923. {
  924.    if (memcard_number!=-1)
  925.    {
  926.        neogeo_memcard_save();
  927.        memset(neogeo_memcard, 0, 0x800);
  928.        memcard_status=0;
  929.        memcard_number=-1;
  930.    }
  931. }
  932.  
  933. int neogeo_memcard_create(int number)
  934. {
  935.     char buf[0x800];
  936.     char name[16];
  937.     void *f1, *f2;
  938.  
  939.     sprintf(name, "MEMCARD.%03d", number);
  940.     if ((f1=osd_fopen(0, name, OSD_FILETYPE_MEMCARD,0))==0)
  941.     {
  942.         if ((f2=osd_fopen(0, name, OSD_FILETYPE_MEMCARD,1))!=0)
  943.         {
  944.             osd_fwrite(f2,buf,0x800);
  945.             osd_fclose(f2);
  946.             return 1;
  947.         }
  948.     }
  949.     else
  950.         osd_fclose(f1);
  951.  
  952.     return 0;
  953. }
  954.  
  955.